package com.singletonapps.evory.controller;

import javax.validation.Valid;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.singletonapps.evory.dto.ResponseDto;
import com.singletonapps.evory.dto.UserDto;
import com.singletonapps.evory.exception.UserAlreadyExistException;
import com.singletonapps.evory.service.AdminService;
import com.singletonapps.evory.service.UserService;

@Controller
@RequestMapping(value = "/usuario")
public class UserController {

	private static final Logger LOGGER = LogManager.getLogger(UserController.class.getName());

	@Autowired
	private UserService userService;
	@Autowired
	private AdminService adminService;

	@RequestMapping(value = "/registro", method = RequestMethod.POST)
	public String registerUser(@Valid @ModelAttribute("user") UserDto user,
			BindingResult result, ModelMap map) {

		ResponseDto respuesta = new ResponseDto();

		if (result.hasErrors()) {
			map.put("hasErrors", true);
			return "registration";
		}

		try {
			respuesta = userService.registerUser(user);
			respuesta.setMessage("Felicidades!! te has registrado correctamente");
			map.put("user", new UserDto());
			
		} catch (UserAlreadyExistException e) {
			respuesta.getErrors().add(e.getMessage());
			LOGGER.info("Los datos de email y/o usario ya existen", e);
		} catch (Exception e) {
			respuesta.getErrors().add("Ocurrio un error inesperado al momento del registro del usuario");
			LOGGER.info("Ocurrio un error inesperado al momento del registro del usuario: "+user.getUsuario(), e);
		}

		map.put("respuesta", respuesta);

		return "registration";
	}
	
	@RequestMapping(value = "/cursos/init")
	public String cursosInit(ModelMap map){
		
		map.put("cursos", adminService.cargaTodosLosCursos());
		
		return "courses";
	}
}
